今天來介紹一下 OSM 中包含了哪些資料,大概五分鐘就可以說完。
簡單來講,OSM 中的地理資料只包含三個種類:
和大家直覺想到的「點」、「線」、「面」稍為有點不一樣,且聽我娓娓道來:
首先,所有種類的物件,都使用流水編號來做為其 id。
舉例來說,資料庫中最新的 node id是 9999,那下一個被編輯者創造出來的 node id 就會是 10000。
不同種類的物件,其流水號是獨立的。
https://openstreetmap.org 允許使用者在網頁中顯示單一物件的資訊。
例如在 OSM 資料庫中,玉山山峰的種類是 node,其 id 是 3428095932,那麼就可以用以下的網址進行查詢:
https://openstreetmap.org/node/3428095932
而如果要查詢該物件的原始資訊,則可以使用 OSM API 進行查詢。
要取得玉山這一物件的 XML 格式資料,可以用以下格式:
https://www.openstreetmap.org/api/0.6/node/3428095932
返回內容是由 <osm>
包裏的單一個 <node>
標籤,其內容為:
<node id="3428095932" visible="true" version="15" changeset="137705350" timestamp="2023-06-23T23:15:49Z" user="WWSS" uid="5062752" lat="23.4699871" lon="120.9572739">
<tag k="alt_name:en" v="Jade Mountain;Mt. Morrison"/>
<tag k="ele" v="3952"/>
<tag k="isolation" v="1815"/>
<tag k="name" v="玉山"/>
<tag k="name:bnn" v="Tongku Saveq"/>
<tag k="name:en" v="Yushan"/>
<tag k="name:ja" v="玉山"/>
<tag k="name:pwn" v="kanasi"/>
<tag k="name:tsu" v="Patungkuonʉ"/>
<tag k="name:xnb" v="Tanungu'incu"/>
<tag k="name:zh" v="玉山"/>
<tag k="natural" v="peak"/>
<tag k="prominence" v="3952"/>
<tag k="ref" v="百岳#1;五嶽-1"/>
<tag k="source:prominence" v="Highest peak of Taiwan"/>
<tag k="wikidata" v="Q500275"/>
<tag k="wikipedia" v="zh:玉山"/>
</node>
而若是要取得 JSON 格式的資料,只要在 URL 後面加上 .json
即可:
https://www.openstreetmap.org/api/0.6/node/3428095932.json
結果為
{
"type": "node",
"id": 3428095932,
"lat": 23.4699871,
"lon": 120.9572739,
"timestamp": "2023-06-23T23:15:49Z",
"version": 15,
"changeset": 137705350,
"user": "WWSS",
"uid": 5062752,
"tags": {
"alt_name:en": "Jade Mountain;Mt. Morrison",
"ele": "3952",
"isolation": "1815",
"name": "玉山",
"name:bnn": "Tongku Saveq",
"name:en": "Yushan",
"name:ja": "玉山",
"name:pwn": "kanasi",
"name:tsu": "Patungkuonʉ",
"name:xnb": "Tanungu'incu",
"name:zh": "玉山",
"natural": "peak",
"prominence": "3952",
"ref": "百岳#1;五嶽-1",
"source:prominence": "Highest peak of Taiwan",
"wikidata": "Q500275",
"wikipedia": "zh:玉山"
}
}
目前 OSM API 的版本為 0.6,更多的詳情可見維基頁面
在上面的返回結果裡,我們可以看到玉山有各種不同的 tag,例如name
(在地名稱)、alt_name:en
(英文別稱)、ele
(高度)、wikidata
(wikidata 編號),以及相對應的值。
tag 用於標示物件的各種屬性。
不論是 node, way 或 relation,都可以包含任意種類與數量的 tag。
三個種類裡,只有 node 具有經緯度的地理位置。
way 和 relation 都是透過參照的方式來描述自己在空間中的形狀。
舉例上面的例子來說,玉山的經緯度座標被包含在 <node>
的 attribute 中:
lat="42.8374704" lon="25.1822988"
一個 way 物件會具有以下格式:
<way id="5090250" ...>
<nd ref="822403"/>
<nd ref="21533912"/>
<nd ref="821601"/>
<nd ref="21533910"/>
<nd ref="135791608"/>
<nd ref="333725784"/>
<nd ref="333725781"/>
<nd ref="333725774"/>
<nd ref="333725776"/>
<nd ref="823771"/>
<tag k="highway" v="residential"/>
<tag k="name" v="Clipstone Street"/>
<tag k="oneway" v="yes"/>
</way>
可以看到除了 tag 之外,其內還包含了數個 <nd>
用 id 指向已存在的 node。
這些 node 可以組成線段,或者是多邊形(如果第一個被指向的 node 和最後一個相同)。
因此我們通常使用 way 物件來標示路徑、房屋或者邊界。
和 way 一樣,一個 relation 也同樣使用參照的方式來表示自身。格式可能如下:
<relation id="13092746" ...>
<member type="node" ref="5690770815" role="stop"/>
<member type="node" ref="5751940550" role="stop"/>
...
<member type="node" ref="1764649495" role="stop"/>
<member type="way" ref="96562914" role=""/>
...
<member type="way" ref="928474550" role=""/>
<tag k="from" v="Encre"/>
...
<tag k="website" v="https://www.cacl-guyane.fr/lagglo-au-quotidien/se-deplacer/transport-urbain-2/"/>
</relation>
可以見到,relation 使用 <member>
來將各種 node 與 way 進行關聯,並使用 role
這個 Attribute 來標示這些物件在集合中所扮演的角色。
relation 物件通常在製作地圖不會特別被渲染出來。它更多時候是表示一群物件之間的關係。
總的來說,OSM 的物件分類並不複雜。
只要掌握 node, way 與 relation 之間的關係,在查閱相關頁面,或者檢視下載下來的原始資料集時就可以無往不利。
種類 | id | tag | 地理資訊 |
---|---|---|---|
node | 有 | 有 | 座標 |
way | 有 | 有 | nodes |
relation | 有 | 有 | ways/nodes |